In [1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
plt.style.use("fivethirtyeight")
# For reading stock data from Yahoo
import yfinance as yf
# For time stamps
from datetime import datetime
# The tech stocks we'll use for this analysis
tech_list = ['AAPL', 'GOOG', 'MSFT', 'AMZN']
# Set up End and Start times for data grab
end = datetime.now()
start = datetime(end.year - 1, end.month, end.day)
# Download data for all stocks in one call (more efficient)
stock_data = yf.download(tech_list, start=start, end=end, group_by="ticker")
# Create a dictionary to store data per company
company_data = {}
company_names = {"AAPL": "APPLE", "GOOG": "GOOGLE", "MSFT": "MICROSOFT", "AMZN": "AMAZON"}
for stock in tech_list:
company_data[stock] = stock_data[stock].copy() # Extract individual stock data
company_data[stock]["company_name"] = company_names[stock]
# Concatenate all stock data
df = pd.concat(company_data.values(), axis=0)
# Display the last 10 rows
print(df.tail(10))
YF.download() has changed argument auto_adjust default to True
[*********************100%***********************] 4 of 4 completed
Price Open High Low Close Volume \ Date 2025-02-03 234.059998 239.250000 232.899994 237.419998 37285900 2025-02-04 239.009995 242.520004 238.029999 242.059998 29713800 2025-02-05 237.020004 238.320007 235.199997 236.169998 38727300 2025-02-06 238.009995 239.660004 236.009995 238.830002 60897100 2025-02-07 232.500000 234.809998 228.059998 229.149994 77539300 2025-02-10 230.550003 233.919998 229.199997 233.139999 35419900 2025-02-11 231.919998 233.440002 230.130005 232.759995 23713700 2025-02-12 230.460007 231.179993 228.160004 228.929993 32285200 2025-02-13 228.850006 230.419998 227.520004 230.369995 31346500 2025-02-14 229.199997 229.889999 227.229996 228.679993 26973200 Price company_name Date 2025-02-03 AMAZON 2025-02-04 AMAZON 2025-02-05 AMAZON 2025-02-06 AMAZON 2025-02-07 AMAZON 2025-02-10 AMAZON 2025-02-11 AMAZON 2025-02-12 AMAZON 2025-02-13 AMAZON 2025-02-14 AMAZON
In [2]:
AAPL = company_data['AAPL']
In [3]:
AAPL.describe()
Out[3]:
| Price | Open | High | Low | Close | Volume |
|---|---|---|---|---|---|
| count | 249.000000 | 249.000000 | 249.000000 | 249.000000 | 2.490000e+02 |
| mean | 212.286585 | 214.423832 | 210.409743 | 212.554378 | 5.692713e+07 |
| std | 25.756693 | 26.034031 | 25.471157 | 25.924349 | 3.130313e+07 |
| min | 164.572913 | 165.617978 | 163.308889 | 164.224564 | 2.323470e+07 |
| 25% | 188.695822 | 190.170847 | 187.410124 | 189.204102 | 4.083810e+07 |
| 50% | 223.249686 | 224.855115 | 220.684285 | 222.280777 | 4.953780e+07 |
| 75% | 229.534821 | 232.299271 | 227.908415 | 229.727417 | 6.263130e+07 |
| max | 257.906429 | 259.814335 | 257.347047 | 258.735504 | 3.186799e+08 |
In [4]:
AAPL.info()
<class 'pandas.core.frame.DataFrame'> DatetimeIndex: 249 entries, 2024-02-20 to 2025-02-14 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Open 249 non-null float64 1 High 249 non-null float64 2 Low 249 non-null float64 3 Close 249 non-null float64 4 Volume 249 non-null int64 5 company_name 249 non-null object dtypes: float64(4), int64(1), object(1) memory usage: 13.6+ KB
In [5]:
plt.figure(figsize=(15, 10))
plt.subplots_adjust(top=1.25, bottom=1.2)
for i, (ticker, company) in enumerate(company_data.items(), 1):
plt.subplot(2, 2, i)
company['Close'].plot()
plt.ylabel('Close')
plt.xlabel(None)
plt.title(f"Closing Price of {company_names[ticker]}")
plt.tight_layout()
In [6]:
plt.figure(figsize=(15, 10))
plt.subplots_adjust(top=1.25, bottom=1.2)
for i, (ticker, company) in enumerate(company_data.items(), 1):
plt.subplot(2, 2, i)
company['Volume'].plot()
plt.ylabel('Volume')
plt.xlabel(None)
plt.title(f"Sales Volume of {company_names[ticker]}")
plt.tight_layout()
In [7]:
ma_day = [10, 20, 50]
for ma in ma_day:
for company in company_data:
column_name = f"MA for {ma} days"
company_data[company][column_name] = company_data[company]['Close'].rolling(ma).mean()
fig, axes = plt.subplots(nrows=2, ncols=2)
fig.set_figheight(10)
fig.set_figwidth(15)
AAPL[['Close', 'MA for 10 days', 'MA for 20 days', 'MA for 50 days']].plot(ax=axes[0,0])
axes[0,0].set_title('APPLE')
company_data['GOOG'][['Close', 'MA for 10 days', 'MA for 20 days', 'MA for 50 days']].plot(ax=axes[0,1])
axes[0,1].set_title('GOOGLE')
company_data['MSFT'][['Close', 'MA for 10 days', 'MA for 20 days', 'MA for 50 days']].plot(ax=axes[1,0])
axes[1,0].set_title('MICROSOFT')
company_data['AMZN'][['Close', 'MA for 10 days', 'MA for 20 days', 'MA for 50 days']].plot(ax=axes[1,1])
axes[1,1].set_title('AMAZON')
fig.tight_layout()
In [8]:
for company in company_data.values():
company['Daily Return'] = company['Close'].pct_change()
fig, axes = plt.subplots(nrows=2, ncols=2)
fig.set_figheight(10)
fig.set_figwidth(15)
company_data['AAPL']['Daily Return'].plot(ax=axes[0,0], legend=True, linestyle='--', marker='o')
axes[0,0].set_title('APPLE')
company_data['GOOG']['Daily Return'].plot(ax=axes[0,1], legend=True, linestyle='--', marker='o')
axes[0,1].set_title('GOOGLE')
company_data['MSFT']['Daily Return'].plot(ax=axes[1,0], legend=True, linestyle='--', marker='o')
axes[1,0].set_title('MICROSOFT')
company_data['AMZN']['Daily Return'].plot(ax=axes[1,1], legend=True, linestyle='--', marker='o')
axes[1,1].set_title('AMAZON')
fig.tight_layout()
In [9]:
plt.figure(figsize=(12, 9))
for i, company in enumerate(company_data.values(), 1):
plt.subplot(2, 2, i)
company['Daily Return'].hist(bins=50)
plt.xlabel('Daily Return')
plt.ylabel('Counts')
plt.title(f'{company_names[tech_list[i - 1]]}')
plt.tight_layout()
In [10]:
closing_df = yf.download(tech_list, start=start, end=end, group_by="ticker")
close_prices = closing_df.xs('Close', level=1, axis=1)
tech_rets = close_prices.pct_change()
tech_rets.head()
[*********************100%***********************] 4 of 4 completed
Out[10]:
| Ticker | MSFT | AMZN | GOOG | AAPL |
|---|---|---|---|---|
| Date | ||||
| 2024-02-20 | NaN | NaN | NaN | NaN |
| 2024-02-21 | -0.001515 | 0.009038 | 0.011533 | 0.004186 |
| 2024-02-22 | 0.023547 | 0.035530 | 0.010289 | 0.011244 |
| 2024-02-23 | -0.003182 | 0.002349 | -0.000207 | -0.010034 |
| 2024-02-26 | -0.006824 | -0.001486 | -0.045013 | -0.007451 |
In [11]:
sns.jointplot(x='GOOG', y='GOOG', data=tech_rets, kind='scatter', color='seagreen')
Out[11]:
<seaborn.axisgrid.JointGrid at 0x25e3d562ed0>
In [12]:
sns.jointplot(x='GOOG', y='MSFT', data=tech_rets, kind='scatter')
Out[12]:
<seaborn.axisgrid.JointGrid at 0x25e22ac3890>
In [13]:
sns.pairplot(tech_rets, kind='reg')
Out[13]:
<seaborn.axisgrid.PairGrid at 0x25e22da7200>
In [14]:
return_fig = sns.PairGrid(tech_rets.dropna())
return_fig.map_upper(plt.scatter, color='purple')
return_fig.map_lower(sns.kdeplot, cmap='cool_d')
return_fig.map_diag(plt.hist, bins=30)
Out[14]:
<seaborn.axisgrid.PairGrid at 0x25e3d599940>
In [15]:
returns_fig = sns.PairGrid(closing_df)
returns_fig.map_upper(plt.scatter,color='purple')
returns_fig.map_lower(sns.kdeplot,cmap='cool_d')
returns_fig.map_diag(plt.hist,bins=30)
Out[15]:
<seaborn.axisgrid.PairGrid at 0x25e23dec170>
In [16]:
plt.figure(figsize=(36, 30))
plt.subplot(2, 2, 1)
sns.heatmap(tech_rets.corr(), annot=True, cmap='summer')
plt.title('Correlation of stock return')
plt.subplot(2, 2, 2)
sns.heatmap(closing_df.corr(), annot=True, cmap='summer')
plt.title('Correlation of stock closing price')
Out[16]:
Text(0.5, 1.0, 'Correlation of stock closing price')
In [17]:
rets = tech_rets.dropna()
area = np.pi * 20
plt.figure(figsize=(10, 8))
plt.scatter(rets.mean(), rets.std(), s=area)
plt.xlabel('Expected return')
plt.ylabel('Risk')
for label, x, y in zip(rets.columns, rets.mean(), rets.std()):
plt.annotate(label, xy=(x, y), xytext=(50, 50), textcoords='offset points', ha='right', va='bottom',
arrowprops=dict(arrowstyle='-', color='blue', connectionstyle='arc3,rad=-0.3'))
In [18]:
df = yf.download('AAPL', start='2012-01-01', end=datetime.now())
df
[*********************100%***********************] 1 of 1 completed
Out[18]:
| Price | Close | High | Low | Open | Volume |
|---|---|---|---|---|---|
| Ticker | AAPL | AAPL | AAPL | AAPL | AAPL |
| Date | |||||
| 2012-01-03 | 12.375389 | 12.413608 | 12.308281 | 12.320319 | 302220800 |
| 2012-01-04 | 12.441898 | 12.479215 | 12.316709 | 12.338376 | 260022000 |
| 2012-01-05 | 12.580029 | 12.595677 | 12.418726 | 12.487341 | 271269600 |
| 2012-01-06 | 12.711535 | 12.722068 | 12.615838 | 12.632389 | 318292800 |
| 2012-01-09 | 12.691377 | 12.872540 | 12.679941 | 12.804830 | 394024400 |
| ... | ... | ... | ... | ... | ... |
| 2025-02-10 | 227.649994 | 230.589996 | 227.199997 | 229.570007 | 33115600 |
| 2025-02-11 | 232.619995 | 235.229996 | 228.130005 | 228.199997 | 53718400 |
| 2025-02-12 | 236.869995 | 236.960007 | 230.679993 | 231.199997 | 45243300 |
| 2025-02-13 | 241.529999 | 242.339996 | 235.570007 | 236.910004 | 53614100 |
| 2025-02-14 | 244.600006 | 245.550003 | 240.990005 | 241.250000 | 40838100 |
3300 rows × 5 columns
In [19]:
plt.figure(figsize=(16,6))
plt.title('Close Price History')
plt.plot(df['Close'])
plt.xlabel('Date', fontsize=18)
plt.ylabel('Close Price USD ($)', fontsize=18)
plt.show()
In [20]:
data = df.filter(['Close'])
dataset = data.values
training_data_len = int(np.ceil( len(dataset) * .95 ))
training_data_len
Out[20]:
3135
In [21]:
%pip install scikit-learn
from sklearn.preprocessing import MinMaxScaler
# Ensure 'df' contains the 'Close' prices
data = df['Close'].values.reshape(-1, 1)
scaler = MinMaxScaler(feature_range=(0,1))
scaled_data = scaler.fit_transform(data)
scaled_data
Requirement already satisfied: scikit-learn in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (1.6.1) Requirement already satisfied: numpy>=1.19.5 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from scikit-learn) (2.0.2) Requirement already satisfied: scipy>=1.6.0 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from scikit-learn) (1.15.2) Requirement already satisfied: joblib>=1.2.0 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from scikit-learn) (1.4.2) Requirement already satisfied: threadpoolctl>=3.1.0 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from scikit-learn) (3.5.0) Note: you may need to restart the kernel to use updated packages.
Out[21]:
array([[0.0018211 ],
[0.00209058],
[0.00265024],
...,
[0.91140737],
[0.93028834],
[0.94272711]])
In [22]:
train_data = scaled_data[0:int(training_data_len), :]
x_train = []
y_train = []
In [23]:
for i in range(60, len(train_data)):
x_train.append(train_data[i-60:i, 0])
y_train.append(train_data[i, 0])
if i<= 61:
print(x_train)
print(y_train)
print()
[array([0.0018211 , 0.00209058, 0.00265024, 0.00318307, 0.00310139,
0.00328549, 0.00320135, 0.00305992, 0.00286727, 0.0034635 ,
0.00400122, 0.0038354 , 0.00292701, 0.00379394, 0.00294043,
0.0061411 , 0.00589358, 0.00621671, 0.00691537, 0.00733845,
0.00730309, 0.00717263, 0.00772864, 0.0082517 , 0.00884431,
0.00980145, 0.01181208, 0.01184257, 0.01296189, 0.01379836,
0.01236077, 0.01291436, 0.01290336, 0.01445556, 0.01423486,
0.01464332, 0.01537733, 0.0157858 , 0.01696243, 0.01781959,
0.01806711, 0.01815368, 0.01668811, 0.01633448, 0.0163869 ,
0.01776474, 0.01815245, 0.01898523, 0.02094832, 0.0235674 ,
0.02307725, 0.02307846, 0.02497206, 0.02556464, 0.02514274,
0.02475743, 0.0243563 , 0.02568899, 0.02660346, 0.02698634])]
[np.float64(0.02604015988447974)]
[array([0.0018211 , 0.00209058, 0.00265024, 0.00318307, 0.00310139,
0.00328549, 0.00320135, 0.00305992, 0.00286727, 0.0034635 ,
0.00400122, 0.0038354 , 0.00292701, 0.00379394, 0.00294043,
0.0061411 , 0.00589358, 0.00621671, 0.00691537, 0.00733845,
0.00730309, 0.00717263, 0.00772864, 0.0082517 , 0.00884431,
0.00980145, 0.01181208, 0.01184257, 0.01296189, 0.01379836,
0.01236077, 0.01291436, 0.01290336, 0.01445556, 0.01423486,
0.01464332, 0.01537733, 0.0157858 , 0.01696243, 0.01781959,
0.01806711, 0.01815368, 0.01668811, 0.01633448, 0.0163869 ,
0.01776474, 0.01815245, 0.01898523, 0.02094832, 0.0235674 ,
0.02307725, 0.02307846, 0.02497206, 0.02556464, 0.02514274,
0.02475743, 0.0243563 , 0.02568899, 0.02660346, 0.02698634]), array([0.00209058, 0.00265024, 0.00318307, 0.00310139, 0.00328549,
0.00320135, 0.00305992, 0.00286727, 0.0034635 , 0.00400122,
0.0038354 , 0.00292701, 0.00379394, 0.00294043, 0.0061411 ,
0.00589358, 0.00621671, 0.00691537, 0.00733845, 0.00730309,
0.00717263, 0.00772864, 0.0082517 , 0.00884431, 0.00980145,
0.01181208, 0.01184257, 0.01296189, 0.01379836, 0.01236077,
0.01291436, 0.01290336, 0.01445556, 0.01423486, 0.01464332,
0.01537733, 0.0157858 , 0.01696243, 0.01781959, 0.01806711,
0.01815368, 0.01668811, 0.01633448, 0.0163869 , 0.01776474,
0.01815245, 0.01898523, 0.02094832, 0.0235674 , 0.02307725,
0.02307846, 0.02497206, 0.02556464, 0.02514274, 0.02475743,
0.0243563 , 0.02568899, 0.02660346, 0.02698634, 0.02604016])]
[np.float64(0.02604015988447974), np.float64(0.024783058817361543)]
In [24]:
x_train, y_train = np.array(x_train), np.array(y_train)
x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))
In [25]:
%pip install tensorflow
from keras.models import Sequential
from keras.layers import Dense, LSTM
Requirement already satisfied: tensorflow in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (2.18.0) Requirement already satisfied: tensorflow-intel==2.18.0 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow) (2.18.0) Requirement already satisfied: absl-py>=1.0.0 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (2.1.0) Requirement already satisfied: astunparse>=1.6.0 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (1.6.3) Requirement already satisfied: flatbuffers>=24.3.25 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (25.2.10) Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (0.6.0) Requirement already satisfied: google-pasta>=0.1.1 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (0.2.0) Requirement already satisfied: libclang>=13.0.0 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (18.1.1) Requirement already satisfied: opt-einsum>=2.3.2 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (3.4.0) Requirement already satisfied: packaging in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (24.2) Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<6.0.0dev,>=3.20.3 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (5.29.3) Requirement already satisfied: requests<3,>=2.21.0 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (2.32.3) Requirement already satisfied: setuptools in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (75.8.0) Requirement already satisfied: six>=1.12.0 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (1.17.0) Requirement already satisfied: termcolor>=1.1.0 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (2.5.0) Requirement already satisfied: typing-extensions>=3.6.6 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (4.12.2) Requirement already satisfied: wrapt>=1.11.0 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (1.17.2) Requirement already satisfied: grpcio<2.0,>=1.24.3 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (1.70.0) Requirement already satisfied: tensorboard<2.19,>=2.18 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (2.18.0) Requirement already satisfied: keras>=3.5.0 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (3.8.0) Requirement already satisfied: numpy<2.1.0,>=1.26.0 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (2.0.2) Requirement already satisfied: h5py>=3.11.0 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (3.12.1) Requirement already satisfied: ml-dtypes<0.5.0,>=0.4.0 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorflow-intel==2.18.0->tensorflow) (0.4.1) Requirement already satisfied: wheel<1.0,>=0.23.0 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from astunparse>=1.6.0->tensorflow-intel==2.18.0->tensorflow) (0.45.1) Requirement already satisfied: rich in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from keras>=3.5.0->tensorflow-intel==2.18.0->tensorflow) (13.9.4) Requirement already satisfied: namex in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from keras>=3.5.0->tensorflow-intel==2.18.0->tensorflow) (0.0.8) Requirement already satisfied: optree in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from keras>=3.5.0->tensorflow-intel==2.18.0->tensorflow) (0.14.0) Requirement already satisfied: charset-normalizer<4,>=2 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from requests<3,>=2.21.0->tensorflow-intel==2.18.0->tensorflow) (3.4.1) Requirement already satisfied: idna<4,>=2.5 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from requests<3,>=2.21.0->tensorflow-intel==2.18.0->tensorflow) (3.10) Requirement already satisfied: urllib3<3,>=1.21.1 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from requests<3,>=2.21.0->tensorflow-intel==2.18.0->tensorflow) (2.3.0) Requirement already satisfied: certifi>=2017.4.17 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from requests<3,>=2.21.0->tensorflow-intel==2.18.0->tensorflow) (2025.1.31) Requirement already satisfied: markdown>=2.6.8 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorboard<2.19,>=2.18->tensorflow-intel==2.18.0->tensorflow) (3.7) Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorboard<2.19,>=2.18->tensorflow-intel==2.18.0->tensorflow) (0.7.2) Requirement already satisfied: werkzeug>=1.0.1 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from tensorboard<2.19,>=2.18->tensorflow-intel==2.18.0->tensorflow) (3.1.3) Requirement already satisfied: MarkupSafe>=2.1.1 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from werkzeug>=1.0.1->tensorboard<2.19,>=2.18->tensorflow-intel==2.18.0->tensorflow) (3.0.2) Requirement already satisfied: markdown-it-py>=2.2.0 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from rich->keras>=3.5.0->tensorflow-intel==2.18.0->tensorflow) (3.0.0) Requirement already satisfied: pygments<3.0.0,>=2.13.0 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from rich->keras>=3.5.0->tensorflow-intel==2.18.0->tensorflow) (2.19.1) Requirement already satisfied: mdurl~=0.1 in e:\miniconda3\envs\stockmarketlstm\lib\site-packages (from markdown-it-py>=2.2.0->rich->keras>=3.5.0->tensorflow-intel==2.18.0->tensorflow) (0.1.2) Note: you may need to restart the kernel to use updated packages.
In [26]:
model = Sequential()
model.add(LSTM(128, return_sequences=True, input_shape=(x_train.shape[1], 1)))
model.add(LSTM(64, return_sequences=False))
model.add(Dense(25))
model.add(Dense(1))
e:\miniconda3\envs\StockMarketLSTM\Lib\site-packages\keras\src\layers\rnn\rnn.py:200: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead. super().__init__(**kwargs)
In [28]:
test_data = scaled_data[training_data_len - 60: , :]
x_test = []
y_test = data[training_data_len:, :] # Ensure y_test contains the correct data
for i in range(60, len(test_data)):
x_test.append(test_data[i-60:i, 0])
x_test = np.array(x_test)
x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1 ))
predictions = model.predict(x_test)
predictions = scaler.inverse_transform(predictions)
y_test = y_test.reshape(-1, 1) # Reshape y_test to match predictions
rmse = np.sqrt(np.mean(((predictions - y_test) ** 2)))
rmse
6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 15ms/step
Out[28]:
np.float64(204.67338477702145)
In [30]:
train = df[:training_data_len]
valid = df[training_data_len:].copy()
valid['Predictions'] = predictions
plt.figure(figsize=(16,6))
plt.title('Model')
plt.xlabel('Date', fontsize=18)
plt.ylabel('Close Price USD ($)', fontsize=18)
plt.plot(train['Close'])
plt.plot(valid[['Close', 'Predictions']])
plt.legend(['Train', 'Val', 'Predictions'], loc='lower right')
plt.show()
In [31]:
valid
Out[31]:
| Price | Close | High | Low | Open | Volume | Predictions |
|---|---|---|---|---|---|---|
| Ticker | AAPL | AAPL | AAPL | AAPL | AAPL | |
| Date | ||||||
| 2024-06-20 | 208.977646 | 213.522384 | 208.150439 | 213.213410 | 86172500 | 23.190502 |
| 2024-06-21 | 206.794983 | 211.180238 | 206.416251 | 209.685263 | 246421400 | 23.271090 |
| 2024-06-24 | 207.442795 | 211.987518 | 205.897984 | 207.024203 | 80727000 | 23.333908 |
| 2024-06-25 | 208.369690 | 210.671950 | 207.911224 | 208.449409 | 56713900 | 23.387434 |
| 2024-06-26 | 212.535690 | 214.140298 | 209.934432 | 210.791552 | 66213200 | 23.434547 |
| ... | ... | ... | ... | ... | ... | ... |
| 2025-02-10 | 227.649994 | 230.589996 | 227.199997 | 229.570007 | 33115600 | 24.936857 |
| 2025-02-11 | 232.619995 | 235.229996 | 228.130005 | 228.199997 | 53718400 | 24.919195 |
| 2025-02-12 | 236.869995 | 236.960007 | 230.679993 | 231.199997 | 45243300 | 24.916225 |
| 2025-02-13 | 241.529999 | 242.339996 | 235.570007 | 236.910004 | 53614100 | 24.929735 |
| 2025-02-14 | 244.600006 | 245.550003 | 240.990005 | 241.250000 | 40838100 | 24.963127 |
165 rows × 6 columns